package com.zhn.usermanager.controller;

import com.zhn.usermanager.mail.MyJavaMail;
import com.zhn.usermanager.pojo.User;
import com.zhn.usermanager.service.impl.UserServiceImpl;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 邮箱注册与激活
 * @author 16053
 */
@RestController
@Api(value = "用户表(User)管理",tags = "用户表(User)管理接口API")
@ApiResponses({
        @ApiResponse(code=400,message="请求参数不完整或者错误"),
        @ApiResponse(code=404,message="找不到页面"),
        @ApiResponse(code=405,message="请求方式不正确，比如后台接收是post，但前端请求的是get"),
        @ApiResponse(code=406,message="页面地址和接口名冲突"),
        @ApiResponse(code=415,message="请求格式不正确，前端可能没有把请求头修改为json，也可能前端请求的json对象没有转换为字符串"),
        @ApiResponse(code=500,message="后台服务逻辑错误")
})
public class MailController {
    /*
    周末完成一个注册页面(账户、密码、手机号、邮箱地址), 注册完毕之后，不能登陆，需要到指定的邮件地址中，点击激动才能登录

    1. 发送邮件的功能
       发送邮件，需要指定接收者的邮件地址，发送成功之后，把uuid和邮件地址写入到数据库中
    2. 激活账户的功能
       接收用户的请求，用户请求参数中传递uuid值，后台收到uuid值，然后检查是哪一个账户的，自动把此账户的action状态修改为1
    所以我们需要两个接口

     */

    @Resource
    private UserServiceImpl userService;

    @PostMapping("/register")
    @ApiOperation(value = "注册激活",notes = "注册激活",httpMethod = "POST")
    public Map<String, Object> register(@RequestBody @ApiParam(name = "user",value = "pojo模型",required = true) User user) throws InterruptedException {

        // java系统默认生成的uuid，但是默认的uuid是有横杠隔开的，项目中需要手动去掉横杠
        String uuid = UUID.randomUUID().toString().replaceAll("-","");          // 生成唯一随机码;
        Thread thread = new Thread(new MyJavaMail(user.getUsername(),user.getEmail(),uuid));
        thread.start();
        thread.join();  //等待所有子线程执行完毕
        user.setUuid(uuid);
//        System.out.println(user.getUuid());
        // 新增用户数据库字段信息
        this.userService.insert(user);
        // 发送邮件
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "请到邮箱激活！");
        return map;   // 返回信息提示用户到邮件激活
    }

    @ApiOperation(value = "验证激活",notes = "验证激活",httpMethod = "get")
    @GetMapping("/jiHuo")
    public Map<String, Object> jiHuo(@RequestParam String uuid) {   // 当用户点击激活地址，会调用指定接口，此接口会接收到uuid值
        // 通过uuid检查用户账户是否存在，如果存在，则更新用户的状态为1，代表激活
        return userService.selectByUuid(uuid);
    }

}
